\section{Komponentenentwurf}
\subsection{Object}
Die Klasse Object ist ''Die Basisklasse aller Basisklassen''. Sie dient nur dazu, dass alle Klassen eine gemeinsame Basisklasse haben.

\subsection{IRead}
IRead ist ein Interface welches Funktionsprototypen zum hinzufügen von Adressen und Personen bereitstellt. Es wird von AddressManager implementiert und von den Readern verwendet. Es wird hier ein Interface verwendet, damit es keine Kopplung zwischen AddressManager und Reader gibt.

\subsection{IWrite}
IRead ist ein Interface welches einen Funktionsprototyp zum abfragen von Adressen und deren zugeordneten Personen bereitstellt. Es wird von AddressManager implementiert und von den Writern verwendet. Es wird hier ein Interface verwendet, damit es keine Kopplung zwischen AddressManager und Writer gibt.

\subsection{Person}
Die Klasse Person repräsentiert eine Person wie sie in den Eingabedateien eingelesen wird. Eine Person hat einen Namen und einen Index welcher angibt, an welcher Adresse eine Person wohnt.

\subsection{Address}
Die Klasse Address repräsentiert eine Adresse wie sie aus den Eingabedateien eingelesen wird. Es werden die Straße, die Hausnummer, die Postleitzahl und die Stadt einer Adresse gespeichert. Eine Adresse selbst weißt nichts über ihre Einwohner.

\subsection{Reader}
Die abstrakte Klasse Reader ist verantwortlich für das Einlesen von Dateien. Innerhalb dieser Klasse befindet sich die Template Method, die zu den Funktionen zum Adressen- und Personenlesen deligiert.

\subsection{AddressReader}
Diese Klasse implementiert die abstrakte Methode DoRead() aus der Klasse Reader. Sie ist verantwortlich für das Lesen von Adressen. Bei Fehlern in der Grammatik wird eine Exception geworfen.

\subsection{PersonReader}
Diese Klasse implementiert die abstrakte Methode DoRead() aus der Klasse Reader. Sie ist verantwortlich für das Lesen von Personen. Bei Fehlern in der Grammatik wird eine Exception geworfen.

\subsection{Writer}
Writer ist eine abstrakte Klasse welche eine Funktion zum Schreiben von Dateien bereitstellt. Writer kümmert sich darum, dass die zu schreibende Datei geöffnet wird und ruft dann die Template Method DoWrite() auf welche von den abgeleiteten Klassen implementiert werden muss. Writer sorgt ebenfalls dafür, dass die Datei am Ende wieder geschlossen wird.

\subsection{AsciiWriter}
AsciiWriter erweiter die Klasse Writer und implementiert dessen abstrakte Methode (die Template Method) DoWrite(). Der AsciiWriter schreibt die Adressen mit deren Personen als ''unformatierte'' Ascii-Datei.

\subsection{HtmlWriter}
HtmlWriter erweiter die Klasse Writer und implementiert dessen abstrakte Methode (die Template Method) DoWrite(). Der HtmlWriter schreibt die Adressen mit deren Personen mit HTML-Formatangaben in eine Datei.

\subsection{AddressManager}
Diese Klasse bildet die Manager-Klasse. Sie hält sämtliche Informationen über die Personen und Adressen in einer list bzw. in einem vector. Eine map hält die mit den Adressen verlinkten Personen. Implementiert wurden die Funktionen ReadFile(), um Informationen von Textdateien einzulesen, LinkAddresses(), um Adressen mit Personen zu verbinden und WriteAddresses(), um die verlinkten Informationen im Ascii- oder HTML-Format auszugeben. In dieser Klasse werden auch die Interfaces IWrite und IRead implementiert.